home *** CD-ROM | disk | FTP | other *** search
- /*
- * netRoute.c --
- *
- * This is the code that maintains a table of routes to
- * Sprite hosts. The routes contain the transport level
- * headers that need to be pre-pended to messages so that
- * they get to the desired Sprite Host.
- * Routes are added via a system call or determined dynamically using
- * Sprite's version of ARP (Address Resolution Protocol). ARP is
- * invoked when a call to Net_Output is made with a SpriteID for
- * which there is no route. Its use is hidden within Net_Output
- * should not affect the caller of Net_Output.
- *
- * Operations on routes are:
- * Net_InstallRoute - Set the Sprite ID for an ethernet address
- * Net_AddrToID - Get the Sprite ID for an ethernet address
- * Net_IDToRoute - Return the route for a Sprite host.
- * Furthermore, the Test_Stats system call will return a route
- * to a user program with the NET_GET_ROUTE command.
- *
- * Copyright 1988 Regents of the University of California
- * Permission to use, copy, modify, and distribute this
- * software and its documentation for any purpose and without
- * fee is hereby granted, provided that the above copyright
- * notice appear in all copies. The University of California
- * makes no representations about the suitability of this
- * software for any purpose. It is provided "as is" without
- * express or implied warranty.
- *
- */
-
- #ifndef lint
- static char rcsid[] = "$Header: /sprite/src/kernel/net/RCS/netRoute.c,v 9.8 91/03/15 15:48:23 jhh Exp Locker: mgbaker $ SPRITE (Berkeley)";
- #endif
-
- #include <sprite.h>
- #include <net.h>
- #include <netRoute.h>
- #include <netInt.h>
- #include <netUltraInt.h>
- #include <sys.h>
- #include <stdlib.h>
- #include <timer.h>
- #include <sync.h>
- #include <proc.h>
- #include <rpc.h>
- #include <string.h>
- #include <vm.h>
-
- /*
- * Wildcard address for the Ultranet. This address matches any address.
- */
-
- static Net_UltraTLAddress wildcardAddress =
- {7, NET_ULTRA_TSAP_SIZE};
- /*
- * The Route table.
- * The table is indexed by Sprite Host IDs. Access to
- * the table is synchronized with a MASTER_LOCK to prevent
- * changes from interfering with packet handling.
- */
- List_Links netRouteArray[NET_NUM_SPRITE_HOSTS];
- NetHostInfo netHostInfo[NET_NUM_SPRITE_HOSTS];
- int netNumHosts = NET_NUM_SPRITE_HOSTS;
- Sync_Semaphore netRouteMutex = Sync_SemInitStatic("netRouteMutex");
- Sync_Semaphore netFreeRouteMutex = Sync_SemInitStatic("netFreeRouteMutex");
-
- /*
- * Macro to swap the fragOffset field.
- */
- #define SWAP_FRAG_OFFSET_HOST_TO_NET(ptr) { \
- unsigned short *shortPtr; \
- shortPtr = ((unsigned short *)&ptr->ident) + 1; \
- *shortPtr = Net_HostToNetShort(*shortPtr); \
- }
-
- static void FillRouteInfo _ARGS_((Net_Route *routePtr,
- Net_RouteInfo *infoPtr));
-
-
- /*
- *----------------------------------------------------------------------
- *
- * Net_RouteInit --
- *
- * Initialize the broadcast routes. The rest of the routes are
- * installed via the netRoute user program.
- *
- * This uses malloc, so it should be called after Mem_Init.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Initialize the route table and add the broadcast route.
- *
- *----------------------------------------------------------------------
- */
- void
- Net_RouteInit()
- {
- register int i;
- int spriteID;
-
- /*
- * The route table. An array of routes is kept for directing
- * messages to other machines. It is indexed by Sprite host ids.
- */
- for (spriteID=0 ; spriteID<netNumHosts ; spriteID++) {
- List_Init(&netRouteArray[spriteID]);
- }
- /*
- * Install the broadcast route(s) so we can do our first broadcast rpcs.
- */
- for (i = 0; i < netNumInterfaces;i++) {
- Net_Interface *interPtr;
- ReturnStatus status;
-
- interPtr = netInterfaces[i];
- if (interPtr->flags & NET_IFLAGS_BROADCAST) {
- status = Net_InstallRoute(NET_BROADCAST_HOSTID,
- interPtr, &interPtr->broadcastAddress,
- NET_PROTO_RAW, "broadcast", "unknown",
- (ClientData) 0);
- if (status != SUCCESS) {
- printf(
- "Net_RouteInit: unable to install broadcast route for interface %d\n",
- i);
- }
- }
- }
- return;
- }
-
- /*
- *----------------------------------------------------------------------
- *
- * Net_InstallRouteStub --
- *
- * System call stub for Net_InstallRoute
- *
- * Results:
- * A return status.
- *
- * Side effects:
- * See Net_InstallRoute
- *
- *----------------------------------------------------------------------
- */
- ReturnStatus
- Net_InstallRouteStub(size, routeInfoPtr)
- int size;
- Net_RouteInfo *routeInfoPtr; /* Route data */
- {
- ReturnStatus status;
- Net_RouteInfo routeInfo;
- Net_Interface *interPtr;
-
- if (routeInfoPtr == USER_NIL) {
- return (SYS_ARG_NOACCESS);
- }
- if (size != sizeof(Net_RouteInfo)) {
- return (GEN_INVALID_ARG);
- }
- status = Vm_CopyIn(sizeof(Net_RouteInfo), (Address)routeInfoPtr,
- (Address)&routeInfo);
- if (status != SUCCESS) {
- return(status);
- }
- if (routeInfo.version != NET_ROUTE_VERSION) {
- return GEN_INVALID_ARG;
- }
- if (routeInfo.interface < 0 || routeInfo.interface >= netNumInterfaces) {
- printf("Net_InstallRouteStub: interface %d does not exist\n",
- routeInfo.interface);
- return(GEN_INVALID_ARG);
- }
- interPtr = Net_GetInterface(routeInfo.netType, routeInfo.interface);
- if (interPtr == (Net_Interface *) NIL) {
- printf("Net_InstallRouteStub: can't find interface %d\n",
- routeInfo.interface);
- return(GEN_INVALID_ARG);
- }
- status = Net_InstallRoute(routeInfo.spriteID,
- interPtr, routeInfo.netAddress,
- routeInfo.protocol,
- routeInfo.hostname, routeInfo.machType,
- routeInfo.userData);
- return(status);
- }
-
- /*
- *----------------------------------------------------------------------
- *
- * Net_InstallRoute --
- *
- * Install a route to a Sprite host at the specified address.
- * After installing the route the Sprite ID can be used as an
- * argument to Rpc_Call to direct an RPC request to that Sprite host.
- *
- * Results:
- * None.
- *
- * Side effects:
- * Initialize the entry in the route table which is indexed
- * by the Sprite ID to point to a route for the Sprite Host.
- *
- *----------------------------------------------------------------------
- */
-
- ReturnStatus
- Net_InstallRoute(spriteID, interPtr, netAddressPtr, protocol,
- hostname, machType, clientData)
- int spriteID; /* Sprite Host ID */
- Net_Interface *interPtr; /* Interface route is for. */
- Net_Address *netAddressPtr; /* Network addresses (indexed by
- * protocol). */
- int protocol; /* Protocol to use with route. */
- char *hostname; /* Human recognizable name */
- char *machType; /* Machine type to expand $MACHINE */
- ClientData clientData; /* Data for user-level program. */
- {
- register Net_Route *routePtr;
- Net_Route *oldRoutePtr;
- ReturnStatus status = SUCCESS;
- char *headerPtr;
-
- if (Mach_AtInterruptLevel()) {
- printf("Can't install route when at interrupt level (%d)\n",
- spriteID);
- return FAILURE;
- }
- if (spriteID < 0) {
- printf("Invalid sprite id %d\n", spriteID);
- return (GEN_INVALID_ARG);
- }
- /*
- * If we are installing a route and we don't know are own spriteID see
- * if we can learn it from the route.
- */
- if (rpc_SpriteID == 0) {
- if (!NET_ADDRESS_COMPARE(interPtr->netAddress[protocol],
- netAddressPtr[protocol])) {
- rpc_SpriteID = spriteID;
- }
- }
- /*
- * If we know our spriteID and we are installing a route to ourselves we
- * can learn (or at least validate our data).
- */
- if ((rpc_SpriteID > 0) && (rpc_SpriteID == spriteID)) {
- char buffer[128];
-
- if (!(NET_ADDRESS_COMPARE(interPtr->netAddress[protocol],
- netZeroAddress))) {
- interPtr->netAddress[protocol] = netAddressPtr[protocol];
- Net_AddrToString(&interPtr->netAddress[protocol], protocol,
- interPtr->netType, buffer);
- printf("Setting address to %s\n", buffer);
- } else if (NET_ADDRESS_COMPARE(interPtr->netAddress[protocol],
- netAddressPtr[protocol])) {
- Net_AddrToString(&interPtr->netAddress[protocol], protocol,
- interPtr->netType, buffer);
- printf(
- "Warning: address on interface \"%s\" is currently %s\n",
- interPtr->name,
- buffer);
- Net_AddrToString(&netAddressPtr[protocol], protocol,
- interPtr->netType, buffer);
- printf("Attempt to install route using address %s ignored.\n",
- buffer);
- status = FAILURE;
- }
- return status;
- }
- routePtr = (Net_Route *) malloc(sizeof(Net_Route));
- MASTER_LOCK(&netRouteMutex);
-
- /*
- * In order to install internet routes our internet address must be set.
- */
- if ((protocol == NET_PROTO_INET) &&
- (interPtr->netAddress[protocol].inet == netZeroAddress.inet)) {
-
- Boolean found = FALSE;
- int addr;
- Net_Route *tmpPtr;
- /*
- * Try to do a reverse arp to get the internet address.
- */
- LIST_FORALL(&netRouteArray[NET_BROADCAST_HOSTID],
- (List_Links *) tmpPtr){
-
- if (tmpPtr->interPtr == interPtr) {
- found = TRUE;
- break;
- }
- }
- if (!found) {
- printf("Can't find broadcast route for interface %s\n",
- interPtr->name);
- MASTER_UNLOCK(&netRouteMutex);
- return FAILURE;
- }
- addr = Net_RevArp(tmpPtr, protocol, (Net_Address *) NIL,
- &netRouteMutex);
- if (addr == -1) {
- printf("Internet address for interface \"%s\" is not set and\n",
- interPtr->name);
- printf("reverse arp failed. Can't install route.\n");
- MASTER_UNLOCK(&netRouteMutex);
- return FAILURE;
- }
- interPtr->netAddress[protocol].inet = addr;
- }
- if (spriteID >= NET_NUM_SPRITE_HOSTS) {
- printf("Net route table too small!\n");
- MASTER_UNLOCK(&netRouteMutex);
- return FAILURE;
- } else {
- Net_Route *tmpPtr;
- oldRoutePtr = (Net_Route *)NIL;
- LIST_FORALL(&netRouteArray[spriteID], (List_Links *) tmpPtr) {
- if ((tmpPtr->interPtr == interPtr) &&
- (tmpPtr->protocol == protocol)) {
-
- tmpPtr->flags &= ~NET_RFLAGS_VALID;
- oldRoutePtr = tmpPtr;
- break;
- }
- }
- List_InitElement((List_Links *) routePtr);
- List_Insert((List_Links *) routePtr,
- LIST_ATREAR((List_Links *) &netRouteArray[spriteID]));
- (void) strncpy(netHostInfo[spriteID].name, hostname, 20);
- (void) strncpy(netHostInfo[spriteID].machType, machType, 12);
-
- routePtr->flags = NET_RFLAGS_VALID;
- routePtr->refCount = 0;
- routePtr->spriteID = spriteID;
- routePtr->interPtr = interPtr;
- routePtr->maxBytes = interPtr->maxBytes;
- routePtr->minBytes = interPtr->minBytes;
- routePtr->protocol = protocol;
- routePtr->routeID |= spriteID << 16;
- routePtr->userData = clientData;
- sprintf(routePtr->desc, "Route to %s - ", hostname);
- }
- /*
- * Prepare the Route. This includes the transport header that
- * will be used in messages sent to the Sprite Host.
- */
- headerPtr = (char *) routePtr->buffer;
- switch(interPtr->netType) {
- case NET_NETWORK_ETHER: {
- Net_EtherHdr *etherHdrPtr;
- strcat(routePtr->desc, "ethernet, ");
- /*
- * Fill in an ethernet header for the route.
- * The drivers fill in the source part of the ethernet header
- * each time they send out a packet.
- */
- if (oldRoutePtr != (Net_Route *) NIL) {
- etherHdrPtr = (Net_EtherHdr *)oldRoutePtr->headerPtr;
- if (NET_ETHER_COMPARE(
- NET_ETHER_HDR_DESTINATION(*etherHdrPtr),
- netAddressPtr[NET_PROTO_RAW].ether)) {
- printf(
- "Warning: Net_InstallRoute, host <%d> changing ethernet addr\n",
- spriteID);
- }
- }
- if (protocol == NET_PROTO_RAW) {
- etherHdrPtr = (Net_EtherHdr *)routePtr->buffer;
- NET_ETHER_HDR_TYPE(*etherHdrPtr) =
- Net_HostToNetShort(NET_ETHER_SPRITE);
- } else {
- /*
- * Make the ethernet header start on an odd 16 bit boundary so
- * that the (internet) header that follows starts on a
- * 32 bit boundary.
- */
- etherHdrPtr = (Net_EtherHdr *)
- ((((int) routePtr->buffer + 5) & ~0x3) - 2);
- NET_ETHER_HDR_TYPE(*etherHdrPtr) =
- Net_HostToNetShort(NET_ETHER_IP);
- }
- routePtr->headerPtr[NET_PROTO_RAW] = (Address)etherHdrPtr;
- NET_ETHER_ADDR_COPY(netAddressPtr[NET_PROTO_RAW].ether,
- NET_ETHER_HDR_DESTINATION(*etherHdrPtr));
- NET_ETHER_ADDR_COPY(interPtr->netAddress[NET_PROTO_RAW].ether,
- NET_ETHER_HDR_SOURCE(*etherHdrPtr));
- routePtr->netAddress[NET_PROTO_RAW].ether =
- netAddressPtr[NET_PROTO_RAW].ether;
- headerPtr = (char *) etherHdrPtr;
- break;
- }
- case NET_NETWORK_ULTRA: {
- Net_UltraHeader *ultraHdrPtr;
-
- ultraHdrPtr = (Net_UltraHeader *) routePtr->buffer;
- bzero((char *) ultraHdrPtr, sizeof(Net_UltraHeader));
- strcat(routePtr->desc, "ultranet, ");
- routePtr->headerPtr[NET_PROTO_RAW] = (Address) ultraHdrPtr;
- ultraHdrPtr->remoteAddress = wildcardAddress;
- ultraHdrPtr->remoteAddress.tsapSize=2;
- ultraHdrPtr->remoteAddress.tsap[0]=0xff;
- ultraHdrPtr->remoteAddress.tsap[1]=0xff;
- ultraHdrPtr->remoteAddress.address =
- netAddressPtr[NET_PROTO_RAW].ultra;
- ultraHdrPtr->localAddress = wildcardAddress;
- ultraHdrPtr->localAddress.tsapSize=2;
- ultraHdrPtr->localAddress.tsap[0]=0xff;
- ultraHdrPtr->localAddress.tsap[1]=0xff;
- ultraHdrPtr->localAddress.address =
- interPtr->netAddress[NET_PROTO_RAW].ultra;
- ultraHdrPtr->cmd = NET_ULTRA_DGRAM_SEND_REQ;
- headerPtr = (char *) ultraHdrPtr;
- routePtr->netAddress[NET_PROTO_RAW].ultra =
- netAddressPtr[NET_PROTO_RAW].ultra;
- break;
- }
- default:
- printf("Net_InstallRoute: Unknown interface type %d\n",
- interPtr->netType);
- return FAILURE;
- }
- headerPtr += net_NetworkHeaderSize[interPtr->netType];
- switch (protocol) {
- case NET_PROTO_RAW:
- strcat(routePtr->desc, "raw");
- break;
- case NET_PROTO_INET: {
- Net_IPHeader *ipHeader;
- strcat(routePtr->desc, "IP");
- ipHeader = (Net_IPHeader *) headerPtr;
- routePtr->headerPtr[protocol] = (Address)ipHeader;
- /*
- * Initialize the template ipHeader.
- */
- bzero((char *)ipHeader, sizeof(Net_IPHeader));
- ipHeader->headerLen = sizeof(Net_IPHeader) / 4;
- ipHeader->version = NET_IP_VERSION;
- ipHeader->typeOfService = 0;
- /*
- * Kernel IP doesn't handle fragmented IP packets (yet).
- */
- ipHeader->flags = NET_IP_DONT_FRAG;
- SWAP_FRAG_OFFSET_HOST_TO_NET(ipHeader);
- ipHeader->timeToLive = NET_IP_MAX_TTL;
- ipHeader->protocol = NET_IP_PROTOCOL_SPRITE;
- ipHeader->source = interPtr->netAddress[protocol].inet;
- ipHeader->dest = netAddressPtr[NET_PROTO_INET].inet;
- /*
- * Precompute the checksum for the ipHeader. This must be
- * corrected when the totalLen field is updated. Note we
- * store the checksum as the 16 bit sum of the packet
- * header to permit easy updating.
- */
- ipHeader->checksum = Net_InetChecksum(sizeof(Net_IPHeader),
- (Address) ipHeader);
- ipHeader->checksum = ~ipHeader->checksum;
- routePtr->maxBytes -= sizeof(Net_IPHeader);
- routePtr->minBytes -= sizeof(Net_IPHeader);
- if (routePtr->minBytes < 0) {
- routePtr->minBytes = 0;
- }
- routePtr->netAddress[NET_PROTO_INET].inet =
- netAddressPtr[NET_PROTO_INET].inet;
- break;
- }
- default: {
- if (oldRoutePtr != (Net_Route *) NIL) {
- oldRoutePtr->flags |= NET_RFLAGS_VALID;
- }
- routePtr->flags &= ~NET_RFLAGS_VALID;
- oldRoutePtr = routePtr;
- printf("Warning: Unsupported route type in Net_InstallRoute\n");
- break;
- }
- }
- MASTER_UNLOCK(&netRouteMutex);
- if (oldRoutePtr != (Net_Route *) NIL) {
- Net_DeleteRoute(oldRoutePtr);
- }
- return(SUCCESS);
- }
-
- /*
- *----------------------------------------------------------------------
- *
- * Net_ReleaseRoute --
- *
- * Releases a route by decrementing its reference count.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The route if freed if it is invalid and the reference count is zero.
- *
- *----------------------------------------------------------------------
- */
-
- void
- Net_ReleaseRoute(routePtr)
- Net_Route *routePtr;
- {
- Boolean freeIt = FALSE;
- MASTER_LOCK(&netRouteMutex);
- routePtr->refCount--;
- if (Mach_AtInterruptLevel()) {
- goto exit;
- }
- if ((!(routePtr->flags & NET_RFLAGS_VALID)) &&
- (routePtr->refCount <= 0) &&
- (!(routePtr->flags & NET_RFLAGS_DELETING))) {
- routePtr->flags |= NET_RFLAGS_DELETING;
- freeIt = TRUE;
- }
- exit:
- MASTER_UNLOCK(&netRouteMutex);
- if (freeIt) {
- List_Remove((List_Links *) routePtr);
- free((char *) routePtr);
- }
- }
-
- /*
- *----------------------------------------------------------------------
- *
- * Net_DeleteRoute --
- *
- * Deletes a route.
- *
- * Results:
- * None.
- *
- * Side effects:
- * The route is marked as invalid if it has a positive reference
- * count, otherwise it is deleted.
- *
- *----------------------------------------------------------------------
- */
-
- void
- Net_DeleteRoute(routePtr)
- Net_Route *routePtr;
- {
- Boolean freeIt = FALSE;
- MASTER_LOCK(&netRouteMutex);
- routePtr->flags &= ~NET_RFLAGS_VALID;
- if (Mach_AtInterruptLevel()) {
- goto exit;
- }
- if ((routePtr->refCount <= 0) &&
- (!(routePtr->flags & NET_RFLAGS_DELETING))) {
- routePtr->flags |= NET_RFLAGS_DELETING;
- freeIt = TRUE;
- }
- exit:
- MASTER_UNLOCK(&netRouteMutex);
- if (freeIt) {
- List_Remove((List_Links *) routePtr);
- free((char *) routePtr);
- }
- }
-
- /*
- *----------------------------------------------------------------------
- *
- * Net_IDToRouteStub --
- *
- * Stub for the Test_Stats system call, NET_GET_ROUTE command.
- * This gets a route and copies it out to user space.
- *
- * Results:
- * A return status.
- *
- * Side effects:
- * Copies to user space.
- *
- *----------------------------------------------------------------------
- */
- ReturnStatus
- Net_IDToRouteStub(spriteID, size, argPtr)
- int spriteID; /* option parameter to Test_Stats */
- int size; /* Size of user buffer. */
- Address argPtr; /* User space buffer to hold route */
-
- {
- #define MIN(a,b) ((a) < (b) ? (a) : (b))
-
- ReturnStatus status;
- Net_Route *routePtr;
- Net_RouteInfo routeInfo;
- int toCopy;
-
- if (spriteID < 0 || spriteID >= netNumHosts) {
- return(SYS_INVALID_ARG);
- }
- routePtr = Net_IDToRoute(spriteID, 0, FALSE, (Sync_Semaphore *) NIL, 0);
- if (routePtr == (Net_Route *)NIL) {
- routeInfo.version = NET_ROUTE_VERSION;
- routeInfo.flags = 0;
- } else {
- FillRouteInfo(routePtr, &routeInfo);
- }
- toCopy = MIN(size, sizeof(Net_RouteInfo) - sizeof(Net_Header));
- status = Vm_CopyOut(toCopy, (Address)&routeInfo, argPtr);
- if (routePtr == (Net_Route *) NIL) {
- return status;
- }
- if (status == SUCCESS) {
- argPtr += toCopy;
- size -= toCopy;
- toCopy = MIN(size, net_NetworkHeaderSize[routePtr->interPtr->netType]);
- status = Vm_CopyOut(toCopy,
- (Address)routePtr->headerPtr[NET_PROTO_RAW],
- argPtr);
- argPtr += toCopy;
- size -= toCopy;
- switch(routePtr->protocol) {
- case NET_PROTO_INET:
- toCopy = MIN(size, sizeof(Net_IPHeader));
- status = Vm_CopyOut(sizeof(Net_IPHeader),
- (Address)routePtr->headerPtr[NET_PROTO_INET],
- argPtr);
- argPtr += toCopy;
- size -= toCopy;
- break;
- default:
- break;
- }
- }
- Net_ReleaseRoute(routePtr);
- return(status);
- }
-
- /*
- *----------------------------------------------------------------------
- *
- * Net_IDToRoute --
- *
- * Return the route to the host specified by the input sprite id.
- *
- * Results:
- * A pointer to the route for the host.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
- /*ARGSUSED*/
- Net_Route *
- Net_IDToRoute(spriteID, index, doArp, mutexPtr, size)
- int spriteID; /* Sprite id to find route for. */
- int index; /* Which route of many. */
- Boolean doArp; /* Do an arp to find a route? */
- Sync_Semaphore *mutexPtr; /* Mutex to release when doing arp. */
- int size; /* Size of data to send (not used yet). */
- {
- Net_Route *routePtr = (Net_Route *) NIL;
- register Net_Route *tmpPtr;
- int i;
- ReturnStatus status;
-
- if (spriteID >= 0 && spriteID < netNumHosts) {
- while (1) {
- i = 0;
- MASTER_LOCK(&netRouteMutex);
- LIST_FORALL(&netRouteArray[spriteID],(List_Links *) tmpPtr) {
- if (tmpPtr->flags & NET_RFLAGS_VALID) {
- if (index >= 0 && i == index) {
- tmpPtr->refCount++;
- routePtr = tmpPtr;
- break;
- }
- i++;
- }
- }
- MASTER_UNLOCK(&netRouteMutex);
- if (routePtr == (Net_Route *) NIL && doArp) {
- status = Net_Arp(spriteID, mutexPtr);
- if (status != SUCCESS) {
- break;
- }
- doArp = FALSE;
- } else {
- break;
- }
- }
- }
- return(routePtr);
- }
-
- /*
- *----------------------------------------------------------------------
- *
- * Net_AddrToID --
- *
- * Determine the Sprite host ID from a physical address. This is
- * used by a server, or Reverse Arp, to determine a client's Sprite
- * ID from the client's network address.
- *
- * This routine scans the route table looking for an address
- * match with the input address.
- *
- * Results:
- * A Sprite hostid for the host at the address. If the physical
- * address isn't in the table we return a hostid of -1.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
- int
- Net_AddrToID(netType, protocol, addressPtr)
- Net_NetworkType netType;
- int protocol;
- Net_Address *addressPtr; /* Physical address */
- {
- register Net_Route *routePtr;
- register int i;
- register int ID = -1;
-
- MASTER_LOCK(&netRouteMutex);
-
- for (i=0 ; i<netNumHosts ; i++) {
- LIST_FORALL(&netRouteArray[i],(List_Links *) routePtr) {
- if ((routePtr->protocol == protocol) &&
- (routePtr->interPtr->netType == netType) &&
- (!NET_ADDRESS_COMPARE(routePtr->netAddress[protocol],
- *addressPtr))) {
- ID = routePtr->spriteID;
- break;
- }
- }
- }
- MASTER_UNLOCK(&netRouteMutex);
- return(ID);
- }
-
- /*
- *----------------------------------------------------------------------
- *
- * Net_HdrToID --
- *
- * Determine the Sprite host ID from a transport header. This is
- * used by a server to determine a client's Sprite
- * ID from the transport header.
- *
- * This routine scans the route table looking for an address
- * match with the input address. If the flags field of the route
- * specifies that the address is a broadcast address, this will
- * return the correct hostid to use for a broadcast.
- *
- * Results:
- * A Sprite hostid for the host at the address. If the physical
- * address isn't in the table we return a hostid of -1.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
- int
- Net_HdrToID(netType, protocol, headerPtr)
- Net_NetworkType netType;
- int protocol;
- Address headerPtr; /* Transport header. */
- {
- Address offsetPtr;
- Net_Address netAddress;
-
- bzero((char *) &netAddress, sizeof(Net_Address));
- if (protocol == NET_PROTO_RAW) {
- switch(netType) {
- case NET_NETWORK_ETHER: {
- NET_ETHER_ADDR_COPY(
- NET_ETHER_HDR_SOURCE(*((Net_EtherHdr *) headerPtr)),
- netAddress.ether);
- break;
- }
- case NET_NETWORK_ULTRA: {
- netAddress.ultra =
- ((Net_UltraHeader *) headerPtr)->remoteAddress.address;
- break;
- }
- default:
- printf("Net_HdrToID: unknown netType %d\n", netType);
- return -1;
- }
- } else {
- offsetPtr = headerPtr + net_NetworkHeaderSize[netType];
- switch(protocol) {
- case NET_PROTO_INET : {
- netAddress.inet =
- Net_NetToHostInt(((Net_IPHeader *) offsetPtr)->dest);
- break;
- }
- default:
- printf("Net_HdrToID: unknown protocol %d\n", protocol);
- return -1;
- }
- }
- return Net_AddrToID(netType, protocol, &netAddress);
- }
-
-
- /*
- *----------------------------------------------------------------------
- *
- * Net_HdrDestString --
- *
- * Build a printable message of the destination address from a
- * transport header.
- *
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
- void
- Net_HdrDestString(netType, protocol, headerPtr, bufferLen, buffer)
- Net_NetworkType netType;
- int protocol;
- Address headerPtr; /* Transport header. */
- int bufferLen; /* Length of buffer. */
- char *buffer; /* Destination memory for destination string. */
-
- {
- Address offsetPtr;
- Net_Address netAddress;
- static char tmpBuffer[128];
-
- *buffer = '\0';
- if (protocol == NET_PROTO_RAW) {
- switch(netType) {
- case NET_NETWORK_ETHER: {
- NET_ETHER_ADDR_COPY(
- NET_ETHER_HDR_SOURCE(*((Net_EtherHdr *) headerPtr)),
- netAddress.ether);
- break;
- }
- case NET_NETWORK_ULTRA: {
- netAddress.ultra =
- ((Net_UltraHeader *) headerPtr)->remoteAddress.address;
- break;
- }
- default:
- printf("Net_HdrDestString: unknown netType %d\n", netType);
- return;
- }
- } else {
- offsetPtr = headerPtr + net_NetworkHeaderSize[netType];
- switch(protocol) {
- case NET_PROTO_INET : {
- netAddress.inet =
- Net_NetToHostInt(((Net_IPHeader *) offsetPtr)->dest);
- break;
- }
- default:
- printf("Net_HdrDestString: unknown protocol %d\n", protocol);
- return;
- }
- }
- Net_AddrToString(&netAddress, netType, protocol, tmpBuffer);
- (void) strncpy(buffer, tmpBuffer, bufferLen-1);
- return;
- }
-
-
- /*
- *----------------------------------------------------------------------------
- *
- * Net_SpriteIDToName --
- *
- * Map from a Sprite ID to a host name.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------------
- */
-
- void
- Net_SpriteIDToName(spriteID, bufferLen, buffer)
- int spriteID;
- int bufferLen;
- char *buffer;
- {
- *buffer = '\0';
- MASTER_LOCK(&netRouteMutex);
- if (spriteID >= 0 && spriteID < netNumHosts) {
- (void) strncpy(buffer, netHostInfo[spriteID].name, bufferLen-1);
- }
- MASTER_UNLOCK(&netRouteMutex);
- return;
- }
-
- /*
- *----------------------------------------------------------------------------
- *
- * Net_SpriteIDToMachType --
- *
- * Map from a Sprite ID to a machine type string. This string is
- * used by the filesystem when expanding $MACHINE in pathnames.
- *
- * Results:
- * A pointer to a string identifying the machine type, i.e. "sun3".
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------------
- */
-
- void
- Net_SpriteIDToMachType(spriteID, bufferLen, buffer)
- int spriteID;
- int bufferLen;
- char *buffer;
- {
- *buffer = '\0';
- MASTER_LOCK(&netRouteMutex);
- if (spriteID >= 0 && spriteID < netNumHosts) {
- (void) strncpy(buffer, netHostInfo[spriteID].machType, bufferLen-1);
- }
- MASTER_UNLOCK(&netRouteMutex);
- return;
- }
-
- /*
- *----------------------------------------------------------------------
- *
- * Net_HostPrint --
- *
- * Print out a statement concerning a host. This maps to a
- * string hostname if possible, and prints out the message.
- *
- * Results:
- * None.
- *
- * Side effects:
- * printf.
- *
- *----------------------------------------------------------------------
- */
-
- void
- Net_HostPrint(spriteID, string)
- int spriteID;
- char *string;
- {
- Sys_HostPrint(spriteID, string);
- return;
- }
-
- /*
- *----------------------------------------------------------------------
- *
- * FillRouteInfo --
- *
- * Converts from a Net_Route to a Net_RouteInfo. Net_RouteInfo
- * is the structure that is passed to user-level.
- *
- * Results:
- * None.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
-
- static void
- FillRouteInfo(routePtr, infoPtr)
- Net_Route *routePtr; /* The route structure. */
- Net_RouteInfo *infoPtr; /* The route info structure. */
- {
- int i;
-
- infoPtr->version = NET_ROUTE_VERSION;
- infoPtr->spriteID = routePtr->spriteID;
- infoPtr->protocol = routePtr->protocol;
- infoPtr->interface = routePtr->interPtr->number;
- infoPtr->netType = routePtr->interPtr->netType;
- infoPtr->refCount = routePtr->refCount;
- infoPtr->routeID = routePtr->routeID;
- infoPtr->flags = routePtr->flags;
- infoPtr->maxBytes = routePtr->maxBytes;
- infoPtr->minBytes = routePtr->minBytes;
- infoPtr->userData = routePtr->userData;
- for(i = 0; i < NET_MAX_PROTOCOLS; i++) {
- infoPtr->netAddress[i] = routePtr->netAddress[i];
- }
- strncpy(infoPtr->hostname, netHostInfo[routePtr->spriteID].name, 20);
- strncpy(infoPtr->machType, netHostInfo[routePtr->spriteID].machType, 12);
- strncpy(infoPtr->desc, routePtr->desc, 64);
- }
-
-